package main

import (
	"math/rand"
	"fmt"
	"time"
)

func main() {
	//rand.Intn 返回一个随机的整数 n，0 <= n <= 100
	fmt.Println(rand.Intn(100), ",", rand.Intn(100))

	//rand.Float64 返回一个64位浮点数 f，0.0 <= f <= 1.0
	fmt.Println(rand.Float64())

	//这个技巧可以用来生成其他范围的随机浮点数，例如5.0 <= f <= 10.0
	fmt.Println((rand.Float64()*5)+5, ",", (rand.Float64()*5)+5)

	//默认情况下，给定的种子是确定的，每次都会产生相同的随机数数字序列。要产生变化的序列，需要给定一个变化的种子
	//需要注意的是，如果你出于加密目的，需要使用随机数的话，请使用 crypto/rand 包，此方法不够安全
	s1 := rand.NewSource(time.Now().UnixNano())
	r1 := rand.New(s1)
	//调用上面返回的 rand.Source 的函数和调用 rand 包中函数是相同的
	fmt.Println(r1.Intn(100), ",", r1.Intn(100))

	//如果使用相同的种子生成的随机数生成器，将会产生相同的随机数序列。
	s2 := rand.NewSource(42)
	r2 := rand.New(s2)
	fmt.Println(r2.Intn(100), ",", r2.Intn(100))
	s3 := rand.NewSource(42)
	r3 := rand.New(s3)
	fmt.Println(r3.Intn(100), ",", r3.Intn(100))
}
